package com.ws.util;

import com.alibaba.fastjson.JSON;

import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;

/**
 * 工具类，用于读写JSON文件
*/
public class Storage {
    private static final String PATH_PREFIX = "src/com/ws/test/";
    /**
     * 读取数据的方法
     * @param clazz 读取转换的类型
     * @param <T> 定义泛型，用于接收返回去去的数据
     * @return 返回读取数据集合
     */
    public static <T> List<T> reader(Class<T> clazz){
        //1获取需要读取的文件
//        //获取类的全名
//        String name = clazz.getName ();
//        System.out.println (name);
        //获取类的名称,小写
        String jsonFileName = (clazz.getSimpleName ()+".json").toLowerCase();
//        System.out.println (simpleName);
        //判断文件是否存在
        File file = new File (PATH_PREFIX + jsonFileName);
        if (!file.exists ()){
            System.out.println ("文件不存在");
            return new ArrayList<> ();
        }
        //2.创建Stringbuilder用于拼接字符串
        StringBuilder sb  = new StringBuilder ();
        //3.读取数据
        //3.1 创建字节输入流
        //3.2 创建字节缓冲输入流
        //3.3创建byte数组，用于接收读取的数据
        //3.4 声明length变量，用于接收读取到数据的长度
        //3.5 while循环读取数据的长度
        //3.6 将读取的数据拼接
        //3.7 将拼接收的字符串转为LIst集合
        //返回数据
        try(
                InputStream is = new FileInputStream (file);
                BufferedInputStream bis = new BufferedInputStream (is);
        ){
            byte[] bytes = new byte[1024 * 1024];
            int length;
            while((length = bis.read (bytes)) != -1){
                sb.append (new String (bytes, 0,length));
            }
           //将拼接后的JSON 字符串转为LIst集合
            List<T> list = JSON.parseArray(sb.toString(), clazz);
            return list == null ? new ArrayList<>() : list;
        }catch (Exception e){
            e.printStackTrace ();
        }
        //如果报错，返回null
        return new ArrayList<> ();
    }

    /**
     * 写出JSON数据,必须知道文件的位置
     * @param list 需要写出的数据，泛型类型为无限定通配符，代表任意LIst即可
     */
    public static void writer(List<?> list){
//        Class<? extends List> aClass = list.getClass ();
//        String typeName = aClass.getTypeName ();
//        System.out.println (typeName);
//        Class<?> componentType = aClass.getComponentType ();
//        System.out.println (componentType);
        if (list == null ||  list.isEmpty ()){
            //没有数据,直接结束
            return;
        }
        Object o = list.get (0);
        String jsonFileName = (o.getClass ().getSimpleName ()+".json").toLowerCase ();
        //3.写出数据
        try(
               OutputStream os = new FileOutputStream (PATH_PREFIX+jsonFileName);
               BufferedOutputStream bos = new BufferedOutputStream (os);
                )
        {
            //3将对象数据转为JSON字符串
            String jsonString = JSON.toJSONString (list);
            //4.转为byte数组，写出到文件
            byte[] bytes = jsonString.getBytes ();
            bos.write (bytes);
            bos.flush ();
            //jdk1.7之后的新特性，自动释放资源
        }catch (Exception e){
            e.printStackTrace ();
        }

    }
}
